// 定义包路径，该类属于 com.iwms.manage.service.impl 包
package com.iwms.manage.service.impl;

// 导入所需的类
import com.iwms.manage.domain.TaskNumber;
import com.iwms.manage.domain.dto.ReplenishCountOption;
import com.iwms.manage.domain.dto.ShipDistributionOption;
import com.iwms.manage.service.StatisticService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.iwms.manage.mapper.StatisticMapper;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

// 使用 @Service 注解将此类声明为 Spring 的服务组件
@Service
public class StatisticServiceImpl implements StatisticService {

    /**
     * 自动注入 StatisticMapper 实例，用于与数据库交互
     */
    @Autowired
    private StatisticMapper statisticMapper;

    /**
     * 获取工单数量信息（包括总工单数、已完成、进行中和已取消的工单）
     *
     * @return TaskNumber 工单数量对象
     */
    @Override
    public TaskNumber getTaskNum() {
        // 调用 mapper 方法获取工单总数
        return statisticMapper.getTaskNum();
    }

    /**
     * 统计合作伙伴相关数据
     *
     * @return List<Map<String, Object>> 合作伙伴数据列表，每个条目包含合作伙伴名称和其他相关信息
     */
    @Override
    public List<Map<String, Object>> countPartnerData() {
        // 调用 mapper 方法获取合作伙伴统计数据
        return statisticMapper.countPartnerData();
    }

    /**
     * 统计发货数量数据（按商品维度）
     *
     * @return List<Map<String, Object>> 发货数据列表，每个条目包含 SKU ID 和对应的发货数量
     */
    @Override
    public List<Map<String, Object>> countShipNum() {
        // 调用 mapper 方法获取发货统计数据
        return statisticMapper.countShipData();
    }

    /**
     * 统计员工数量数据（按角色维度）
     *
     * @return List<Map<String, Object>> 员工数量数据列表，每个条目包含角色名称和对应的员工数量
     */
    @Override
    public List<Map<String, Object>> countEmpNumData() {
        // 调用 mapper 方法获取员工数量统计数据
        return statisticMapper.countEmpNumData();
    }

    /**
     * 统计运营补货数量数据
     * 从数据库获取补货记录列表，提取补货时间和补货数量字段，构建 ReplenishCountOption 返回
     *
     * @return ReplenishCountOption 补货时间与数量的数据结构
     */
    @Override
    public ReplenishCountOption countReplenishNumData() {
        // 调用 mapper 获取补货记录列表
        List<Map<String, Object>> countList = statisticMapper.getReplenishCount();

        // 如果查询结果不为空
        if(!CollectionUtils.isEmpty(countList)){
            // 提取 "rtime" 字段作为补货时间列表
            List<Object> replenishTimeList = countList.stream().map(map -> {
                return map.get("rtime");
            }).collect(Collectors.toList());

            // 提取 "rcount" 字段作为补货数量列表
            List<Object> replenishCountList = countList.stream().map(map -> {
                return map.get("rcount");
            }).collect(Collectors.toList());

            // 构造并返回 ReplenishCountOption 对象
            return new ReplenishCountOption(replenishTimeList, replenishCountList);
        }

        // 如果没有数据，返回 null
        return null;
    }

    /**
     * 统计发货区域分布数据
     * 从数据库获取发货记录列表，提取发货区域和发货数量字段，构建 ShipDistributionOption 返回
     *
     * @return ShipDistributionOption 发货区域与数量的数据结构
     */
    @Override
    public ShipDistributionOption countShipNumData() {
        // 调用 mapper 获取发货记录列表
        List<Map<String, Object>> countList = statisticMapper.getShipCount();

        // 如果查询结果不为空
        if(!CollectionUtils.isEmpty(countList)){
            // 提取 "sregion" 字段作为发货区域列表
            List<Object> shipRegionList = countList.stream().map(map -> {
                return map.get("sregion");
            }).collect(Collectors.toList());

            // 提取 "scount" 字段作为发货数量列表
            List<Object> shipCountList = countList.stream().map(map -> {
                return map.get("scount");
            }).collect(Collectors.toList());

            // 构造并返回 ShipDistributionOption 对象
            return new ShipDistributionOption(shipRegionList, shipCountList);
        }

        // 如果没有数据，返回 null
        return null;
    }
}
